<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>catch</title>
</head>
<body>
    <script>
        //使用未定义的变量同样会触发失败状态
        // let promise = new Promise((resolve,reject) => {
        //     hd;  
        // }).then(
        //     value => console.log(value),
        //     reason => console.log(reason+'刀郎')
        // );

        //使用onFulfilled或onReject抛出异常,则p2拒绝执行并返回拒因
        // let promise = new Promise((resolve,reject) => {
        //     throw new Error("fail");
        // });

        // let p2 = promise.then();
        // p2.then().then(null,resolve=>{
        //     console.log(resolve+"后盾人")
        // });

        //ccatch用于失败状态的处理函数 等同于 then(null,reject())
        //建议使用catch处理错误
        //将catch放在最后面用于统一处理前面发生的错误
        // const promise = new Promise((resolve,reject) => {
        //     reject(new Error("Notice-Promise Exception"));
        // }).catch(msg => console.error(msg));

        //catch可以捕获之前所有的promise的错误,所以建议将catch放在最后面
        // new Promise((resolve,reject) => {
        //     resolve();
        // }).then(() => {
        //     return new Promise((resolve,reject) => {
        //         reject(".then");
        //     });
        // }).then(() => {}).catch(msg => {
        //     console.log(msg);
        // });

        //错误是冒泡的操作的，下面没有任何一个then定义第二个函数，将一直冒泡到catch处理错误
        // new Promise((resolve,reject) => {
        //     reject(new Error("请求失败"));
        // })
        // .then(msg => {})
        // .then(msg => {})
        // .catch(error => {
        //     console.log(error+'LH')
        // });

        //catch也可以捕获对then抛出的错误处理
        // new Promise((resolve,reject) => {
        //     resolve();
        // })
        // .then(msg => {
        //     throw new Error("这是then抛出的错误");
        // })
        // .catch(msg => {
        //     console.log(msg)
        // })
        // ;

        // new Promise((resolve,reject) => {
        //     resolve("success");
        // })
        // .then(msg => {
        //     console.log(a)
        // }).catch(reason =>{
        //     console.log(reason + 'LH');
        // })
        // ;


        //建议将错误交给catch进行处理，而不是在then中处理
        // new Promise((resolve,reject) => {
        //     reject(new Error('请求失败'));
        // })
        // .then(
        //     msg => {
        //         console.log(msg)  
        //     },
        //     error => {
        //         console.log(error)
        //     }
        // );
        // ;

        //在promise中抛出的错误也会被catch捕获
        // const promise = new Promise((resolve,reject) => {
        //     throw new Error("fail");
        // }).catch(msg => {
        //     console.log(msg.toString() + "后盾人");
        // });

        //可以将上面的代码理解为如下代码，可以理解为内部自动执行try catch
        // const promise = new Promise((resolve,reject) => {
        //     try{
        //         throw new Error("fail");
        //     }catch(error){
        //         reject(error);
        //     }
        // }).catch(msg => {
        //     console.log(msg.toString())
        // });

        //但是像下面的在异步中throw将不会触发catch,而是使用系统错误处理
        // const promise = new Promise((resolve,reject) => {
        //     setTimeout(() => {
        //         throw new Error("fail");
        //     },2000);
        // }).catch(msg => {
        //     console.log(msg + "后盾人")
        // });


        //下面的then方法使用了没有定义的hd函数，也会抛到catch() 进行执行
        //可以理解为内部执行了try catch
        // const promise = new Promise((resolve,reject) => {
        //     resolve();
        // })
        // .then(() => {
        //     hd();
        // })
        // .catch(msg => {
        //     console.log(msg.toString())
        // })
        // ;

        //在catch 中发生的错误也会抛给最近的错误处理
        const promise = new Promise((resolve,reject) => {
            reject();
        })
        .catch(msg => {
            hd();
        }).then(null,error => {
            console.log(error+'LH');
        })
        ;
















    </script>
</body>
</html>